package linter.linterjava.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import linter.linterjava.custom.Constant;
import org.apache.commons.lang3.StringUtils;

import java.util.Calendar;

/**
 * @author 爻
 */
public class JwtUtils {
    /**
     * 根据要放入的有效荷载信息生成token
     * @param userName 用户名
     * @param timeStamp 时间戳
     * @param role 角色
     * @return token
     */
    public static String creatToken(String userName,String timeStamp){
        String secretKey = MD5Utils.getMd5Middle(userName,timeStamp);
        //声明过期时间（时间量度，有效时间）
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND, Constant.ACCESS_TOKEN_ACTIVE);
        //生成JWT token
        return JWT.create()
                .withClaim("userName",userName)
                .withClaim("timeStamp",timeStamp)
                .withExpiresAt(instance.getTime())
                .sign(Algorithm.HMAC256(secretKey));
    }


    /**
     * 验证token
     *
     * @param token token
     */
    public static void verifyToken(String token, String userName, String timeStamp){
        System.out.println(token);
        String secretKey = MD5Utils.getMd5Middle(userName,timeStamp);
        //验证token 签名有效 + 未过期
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secretKey)).build();
        verifier.verify(token.substring(7));
    }

    /**
     * 获得token中的用户名信息，无需secret解密也能获得（不过可能是传输出错的信息）
     */
    public static String getUserName(String token){
        if (StringUtils.isBlank(token)) {
            return null;
        }
        try {
            DecodedJWT jwt = JWT.decode(token.substring(7));
            return jwt.getClaim("userName").asString();
        } catch (JWTDecodeException e) {
            return null;
        }
    }

    /**
     * 获得token中的时间戳信息
     */
    public static String getTimeStamp(String token){
        try {
            DecodedJWT jwt = JWT.decode(token.substring(7));
            return jwt.getClaim("timeStamp").asString();
        } catch (JWTDecodeException e) {
            return null;
        }
    }

}
